<?php
	include_once 'alipay/lib/alipay_rsa.function.php';
	include_once 'alipay/lib/alipay_core.function.php';

	class alipay extends common{
		private $alipay_config;

		function __construct(){
			parent::__construct();
			
			// $this->alipay_config = array(
			// 		//合作身份者id，以2088开头的16位纯数字
			// 		'partner'=>'',
					
			// 		'seller_id'=>'',

			// 		'seller_user_id' => '' ,
					
			// 		//商户的私钥（后缀是.pen）文件相对路径
			// 		'private_key_path'=>'D:/wamp/www/company/alipay/key/rsa_private_key.pem',
					
			// 		//支付宝公钥（后缀是.pen）文件相对路径
			// 		'ali_public_key_path'=>'D:/wamp/www/company/alipay/key/alipay_public_key.pem',
					
					
			// 		//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
					
					
			// 		//签名方式 不需修改
			// 		'sign_type'=>strtoupper('RSA'),
					
			// 		//字符编码格式 目前支持 gbk 或 utf-8
			// 		'input_charset'=>strtolower('utf-8'),
					
			// 		//ca证书路径地址，用于curl中ssl校验
			// 		//请保证cacert.pem文件在当前文件夹目录中
			// 		'cacert'=>getcwd().'\\cacert.pem',
					
			// 		//访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
			// 		'transport'=>'http',
					
			// );
		}

		//设置alipay 配置
		function setConfig($config){
			$this->alipay_config= array(
					//合作身份者id，以2088开头的16位纯数字
					'partner'=>$config['partner'],

					'service_pay'=>$config['service_pay'],
					
					'seller_id'=>$config['seller_id'],
					
					//商户的私钥（后缀是.pen）文件相对路径
					'private_key_path'=>$config['private_key_path'],
					
					//支付宝公钥（后缀是.pen）文件相对路径
					'ali_public_key_path'=>$config['ali_public_key_path'],
					
					/* //商户的私钥（后缀是.pen）文件相对路径
					'private_key_path'=>'/alidata/www/default/tdt_api/alipay/key/rsa_private_key.pem',
						
					//支付宝公钥（后缀是.pen）文件相对路径
					'ali_public_key_path'=>'/alidata/www/default/tdt_api/alipay/key/alipay_public_key.pem',
					
					//商户的私钥（后缀是.pen）文件相对路径
					'private_key_path'=>'/Library/WebServer/www/tjx_api/alipay/key/rsa_private_key.pem',
					
					//支付宝公钥（后缀是.pen）文件相对路径
					'ali_public_key_path'=>'/Library/WebServer/www/tjx_api/alipay/key/alipay_public_key.pem', */
					
					// 服务器异步通知页面路径，需http://格式的完整路径，不能加?id=123这类自定义参数,必须外网可以正常访问
					'notify_url' => $config['notify_url'] , 
					//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
					
					
					//签名方式 不需修改
					'sign_type'=>$config['sign_type'],
					
					//字符编码格式 目前支持 gbk 或 utf-8
					'input_charset'=>$config['input_charset'],
					
					//ca证书路径地址，用于curl中ssl校验
					//请保证cacert.pem文件在当前文件夹目录中
					'cacert'=>$config['cacert'],
					
					//访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
					'transport'=>$config['transport'],
					
				);
		}
		
		/**
		 * 生成代签名数据和签名
		 * @param string $out_trade_no
		 * @return unknown[]|string[]
		 */
		function createSign($param){
			extract($param);
			$table = 'company_order';

			$out_trade_no = $param['out_trade_no'] ? $param['out_trade_no'] : date('Ymd').rand(1000,9999);
			$order_id = $param['order_id'];
			$r = $this->update($table , array('alipay_code' => $out_trade_no , 'pay_style' => '2') , 'id = "'.$order_id.'"');
			
			//计算总金额
			$sql = $table . ' WHERE id = "' . $order_id . '"';
			$order = $this->getInfo($sql);

			$param = array(
					'service'=>$this->alipay_config['service_pay'],
					'partner'=>$this->alipay_config['partner'],
					'_input_charset'=>'utf-8',
					'notify_url'=>$this->alipay_config['notify_url'],
					'out_trade_no'=>$out_trade_no,
					'subject'=>'订单支付',
					'payment_type' => '1',
					'seller_id'=>$this->alipay_config['seller_id'],
					'total_fee'=>$order['pay_money'],
					'body'=>'订单支付',
					'order_id'=>$order_id,
			);
			
			$param_string = createLinkstring($param);
			$sign = rsaSign($param_string, $this->alipay_config['private_key_path']);
			
			return array('param'=>$param,'sign'=>urlencode($sign));
		}
		
		/**
		 * 回调成功函数
		 * @param  [type] $trade_no     
		 * @param  [type] $out_trade_no 
		 * @param  string $type         
		 * @return [type]               
		 */
		function success($trade_no , $out_trade_no , $type = 'payed'){
			//订单状态
			$table = 'company_order';
			$field = array('alipay_code' => $trade_no , 'pay_status' => '2');
			$where = 'alipay_code = "'.$out_trade_no.'"';
			if($type == 'finished'){
				$field = array('pay_status' => '5' , 'trading_status' => '2');
				$out_trade_no = $trade_no;
				$where = 'alipay_code = "'.$out_trade_no.'"';
			}elseif($type == 'refund'){
				//退款成功
				$field = array('pay_status' => '4' , 'trading_status' => '2');
				$info = $this->getInfo($table . ' WHERE alipay_code = "'.$trade_no.'"');
				//更新退款表的退款批次号
				$this->update('company_refund' , array('refund_code' => $out_trade_no) , 'order_id = "' . $info['order_id'] . '"');
				$where = ' id = "'.$info['order_id'].'"';
			}
			$this->update($table, $field , $where);
		}

		/**
		 * 退款签名获取   --- 丢弃
		 * @param  array $param 
		 * @return [type]        
		 */
		function backSign($param){
			extract($param);

			if(!$batch_no){
				$batch_no = date('Ymd').rand(1000,9999);
			}
			$table = 'company_order';
			$sql = $table . ' WHERE id = "' . $order_id . '"';
			$alipay_code = $this->getInfo($sql);
			$alipay_code = $alipay_code['alipay_code'];			//交易号

			$param = array(
					'service'=>'mobile.securitypay.pay',
					'partner'=>$this->alipay_config['partner'],
					'_input_charset'=>'utf-8',
					'notify_url'=>'http://115.28.175.114/company/alipay_notify.php',
					'batch_no'=>$batch_no,
					'batch_num' => '1',
					'refund_date' => date("Y-m-d H:i:s"),
					'detail_data' => $alipay_code . '^' . $refund_cash . '^' . $reason,
					'seller_user_id'=>$this->alipay_config['seller_user_id'],
			);
			
			$param_string = createLinkstring($param);
			$sign = rsaSign($param_string, $this->alipay_config['private_key_path']);
			
			return array('param'=>$param,'sign'=>urlencode($sign));
		}

		/**
		 * 买家退款申请
		 * @param  [type] $param 
		 * @return [type]        
		 */
		function refundApply($param){
			extract($param);
			$order_table = 'company_order';
			$order = $this->getInfo($order_table . ' WHERE id ="'.$order_id.'"');
			if($order['id']){
				
				$arr = array(
					'order_id' => $order_id,
					'type' => 2,
					'refund_cash' => $refund_cash,
					'reason' => $reason
					);
				$nid = $this->insert('company_refund' , $arr);
				if($nid) {
					$error = 0;
					$msg = '';
					$res = $this->update($order_table ,array('trading_status' => '4') , 'id = "'.$order_id.'"');
				}else{
					$error = 1;
					$msg = '申请失败';
				}
			}else{	
				$error = 1;
				$msg = '订单不存在';
			}
			return array('error' => $error , 'msg' => $msg);
		}
		
	}
?>